﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using System.Drawing;
using DAL.Repositories;
using DAL.AbstractRepositories;

namespace DAL.Repositorios
{
    public class ReferenciaRepository : DAL.AbstractRepositories.AbstractRepository<Referencia>
    {
        public override void Insert(Referencia entity)
        {
            Inserted.Add(entity);
        }
        public override void Delete(Referencia entity)
        {
            Deleted.Add(entity);
        }

        public override void Update(Referencia entity)
        {
            Updated.Add(entity);
        }

        public override IEnumerable<Referencia> GetAll()
        {
            
            DataSet ds = getConsultaDataSet(DBNull.Value, DBNull.Value);

            foreach (DataRow dr in ds.Tables[0].Rows)
                yield return crearReferencia(dr.Field<int>("IdReferencia"), dr);


            
        }

        public override Referencia GetById(int id)
        {
            Referencia p = null;
      
            DataSet ds = getConsultaDataSet(id, DBNull.Value);

            foreach (DataRow dr in ds.Tables[0].Rows)
                p = crearReferencia(id, dr);


            return p;
        }

        internal static Referencia crearReferencia(int id, DataRow dr){

            return new Referencia(
                idReferencia: id,
                nombre: dr.Field<string>("NombreRef"),
                listaTelefonos: new Lazy<IList<Telefono>>(() => 
                {
                    return TelefonoReferenciaRepository.telefonosDeReferencia(id);
                }),
                idUsuario: dr.Field<int>("IdUsuario")
                );
        }

        internal static IList<Referencia> ReferenciasUsuario(int IdUsuario) {
            
            IList<Referencia> listaReferencia = new List<Referencia>();

            DataSet ds = getConsultaDataSet(DBNull.Value, IdUsuario);

            foreach (DataRow dr in ds.Tables[0].Rows)
                listaReferencia.Add(crearReferencia(dr.Field<int>("IdReferencia"), dr));

            return listaReferencia.Count > 0 ? listaReferencia : null;
        }

        private static DataSet getConsultaDataSet(object idRef, object idU){
            
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add(new SqlParameter("@IdReferencia",idRef));
            cmd.Parameters.Add(new SqlParameter("@IdUsuario", idU));
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaConsultarGeneralReferencias");

            return ds;
        
        }

        protected override void InsertEntity( Referencia objReferencia){

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@NombreRef", objReferencia.Nombre));
                cmd.Parameters.Add(new SqlParameter("@IdUsuario", objReferencia.IdUsuario));
                DBAccess.ExecuteSPNonQuery(ref cmd, "PaRegistrarReferencia");
            
        }

            protected override void UpdateEntity( Referencia objReferencia){

            
                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdReferencia", objReferencia.Id));
                cmd.Parameters.Add(new SqlParameter("@NombreRef", objReferencia.Nombre));
                cmd.Parameters.Add(new SqlParameter("@IdUsuario", objReferencia.IdUsuario));
                DBAccess.ExecuteSPNonQuery(ref cmd, "PaModificarReferencia");
            
        }

        protected override void DeleteEntity(Referencia objReferencia)
        {
                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdReferencia", objReferencia.Id));
                DBAccess.ExecuteSPNonQuery(ref cmd, "PaEliminarReferencia");
         
        }
    }
}
